#include "../include/defs.h"
#include "../include/kc.h"
#include "../include/sleep.h"
#include "../include/random.h"
#include "../include/scheluderCommons.h"

extern process_t procesos[];
extern int pidActual;
extern peticion peticionesDormir[];
extern int maxmem;

int indiceX = 0;
int ejecutados[100] = { 0 };
int nivelActual = 0;
int actual = 0;
int vuelta = 0;




/*
 * Funcion auxiliar contar procesos que sirve para despues hacer el "sorteo"
 */
int contarProcesos(void) {
	int resp = 0;
	int i;
	for (i = 0; i < MAXPROCESOS; i++) {
		if (!procesos[i].free_slot && procesos[i].bloqueado == 0 && i != IDLE) {
			resp++;
		}
	}
	return resp;
}

#define CANT_MAX_ 5
int anteriorP = 0;
int mayor = 1;
int vueltas = 0;
/*
 * Me devuelve el siguiente proceso
 * haciendo un "sorteo por las prioridades"
 */
process_t *
GetNextTask(void) {
	int p1 = 0;
	int p2 = 0;
	int condicion = 1;
	int primero = 1;
	int segundo = 1;
	int i;
	int cantidadP;
	int salir = 0;
	int cant;

	for (i = 0; i < MAXPROCESOS; i++) {
		if (peticionesDormir[i].time != 0) {
			if (--peticionesDormir[i].time == 0)
				desbloqueaProceso(peticionesDormir[i].pid);
		}
	}

	if (NoHayProcesos()) {
		ejecutados[indiceX] = IDLE;
		indiceX = (indiceX + 1) % 100;
		return &procesos[IDLE];
	}

	/*Cuento entre cuantos debo hacer la loteria*/
	cantidadP = contarProcesos();




	p1 = random(cantidadP + 1, &anteriorP);
	p2 = random(cantidadP + 1, &anteriorP);


	/*Asigno los verdaderos i para cada uno*/

	for (i = 0, cant = 0; i < MAXPROCESOS & !salir; i++) {
		if (!procesos[i].free_slot && procesos[i].bloqueado == 0 && i != IDLE) {
			cant++;
			if (cant == p1) {
				p1 = i;
				salir = 1;
			}

		}
	}
	salir = 0;
	cant = 0;
	for (i = 0, cant = 0; i < MAXPROCESOS & !salir; i++) {

		if (!procesos[i].free_slot && procesos[i].bloqueado == 0 && i != IDLE) {
			cant++;
			if (cant == p2) {
				p2 = i;
				salir = 1;
			}
		}
	}

	/*Devuelvo cada uno depende si es mayor o menor*/
//	if (/*mayor*/ p1 > p2) {
		/*if (vueltas == CANT_MAX_) {
			vueltas = 0;
			mayor = 0;
		} else
			vuelta++;*/
		if (procesos[p2].prioridad > procesos[p1].prioridad) {

			ejecutados[indiceX] = p2;
			indiceX = (indiceX + 1) % 100;
			return &procesos[p2];
		} else {
			ejecutados[indiceX] = p1;
			indiceX = (indiceX + 1) % 100;
			return &procesos[p1];
		}
	/*} else {
		mayor = 1;
		if (procesos[p2].prioridad < procesos[p1].prioridad) {

			ejecutados[indiceX] = p2;
			indiceX = (indiceX + 1) % 100;
			return &procesos[p2];
		} else {
			ejecutados[indiceX] = p1;
			indiceX = (indiceX + 1) % 100;
			return &procesos[p1];
		}
	}*/

	/*Si falla todo GOD will recue us*/
	ejecutados[indiceX] = IDLE;
	indiceX = (indiceX + 1) % 100;
	return &procesos[IDLE];
}

int LoadESP(process_t * proc) {
	return proc->ESP;
}

